package com.itcam.phaseii.exception_;

public class TryCatch01 {
    public static void main(String[] args) {
//        try {
//            // 代码/可能有异常
//        } catch (Exception e) {
//            // 捕获到异常
//            //   1.当异常发生时
//            //   2.系统将异常封装成Exception对象e，传递catch
//            //   3.得到异常对象后，程序员，自己处理
//            //   4.注意，如果没有发生异常
//            // catch代码块不执行
//        } finally {
//            //  1.不管try代码块是否异常发生，始终要执行finally
//            //  2.所以通常将释放资源的代码放在finally
//        }

        int num1 = 10;
        int num2 = 0;
        try {
            int res = num1 / num2;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

        //1. 如果异常发生了，则异常发生后面的代码不会执行，直接进入到catch块
        //2. 如果异常没有发生，则顺序执行try的代码块，不会进入到catch
        //3. 如果希望不管是否发生异常，都执行某段代码(比如关闭连接，释放资源等)则使用如下代码- finally

        try {
            String str = "cammy";
            int a = Integer.parseInt(str);
            System.out.println("数字：" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息 = " + e.getMessage());
        } finally {
            System.out.println("finally代码块被执行...");
        }

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

        /**
         * 4.可以有多个catch语句，捕获不同的异常（进行不同的业务处理），要求父类异常在后，子类异常在前。
         *      比如（Exception在后，NullPointerException在前），如果发生异常，只会匹配一个catch
         */
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName()); // NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2; // ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指针异常 = " + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算术异常 = " + e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
        }

        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

        /*
        可以进行try-finally 配合使用, 这种用法相当于没有捕获异常，
        因此程序会直接崩掉/退出。应用场景，就是执行一段代码，不管是否发生异常，
        都必须执行某个业务逻辑
        */
        try {
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        } finally {
            System.out.println("执行了finally..");
        }
        System.out.println("程序继续执行..");
    }
}

class Person {
    private String name = "cammy";

    public String getName() {
        return name;
    }
}